"""
File:manage.py
Author: anning
Date:-03-30
Connect:792910452@qq.com
Description:
入口文件
添加db后，要先将db进行初始化
  1）python manage.py db init
  2)python manage.py db migrate
  3)python manage.py db upgrade
在shell中给数据库roles表中中添加数据：
  1）python manage.py shell
  2)创建一个角色： role=Role(name='管理员')
  3）db.session.add(role)
  4)db.session.commit()
添加好后查看：
  Role.query.all()
  role.id
在shell中给数据库中users表添加数据：
  1)user=User(username='anan')
  2)user.password='anan'
  3)user.role=role
  4)db.session.add(user)
  5)db.session.commit()
查看：
 role.users
 user.role
 role.user.id
 role.user.name
"""
from app import create_app,db
from flask_script import Manager,Shell
from flask_migrate import Migrate,MigrateCommand
from app.models import Role, User, Category, Todo

app=create_app(config_name='production')
manager=Manager(app)
# 将数据库迁移插件与数据库db和app关联
migrate=Migrate(app,db)


@manager.command
def tests():
    """
    执行Flask项目的测试用例
    """
    import unittest
    # 将发现的所有app测试用例（testcase）绑定为测试集合（testsuite）,使用testloader进行绑定
    tests=unittest.TestLoader().discover('tests')
    # verbosity是测试结果的复杂度，有0，1，2三种复杂度
    unittest.TextTestRunner(verbosity=2).run(tests)


@manager.command
def category_ini():
    """初始化分类信息"""
    ca1=Category(name='重要紧急任务')
    ca2=Category(name='不重要紧急任务')
    ca3=Category(name='重要不紧急任务')
    ca4=Category(name='不重要不紧急任务')
    db.session.add_all([ca1,ca2,ca3,ca4])
    db.session.commit()


def make_shell_context():
    # 由于设置了make_shell_context变量，因此在交互式环境中执行python manage.py shell，会有app、db、Role、User参数，后续需要更多课直接在这里添加相应的键值对
    return dict(app=app,Role=Role,User=User,Category=Category,Todo=Todo)


if __name__ == '__main__':
    #app=create_app()
    #host='0.0.0.0'其中0表示任意，这个IP则表示我的IP地址在共享时可以和任意一个IP地址绑定在一起
    #app.run()
    #初始化 Flask-Script、Flask-Migrate和为Python shell定义的上下文
    #在交互式环境中，执行python manage.py shell时，会自动闯入参数/变量app、db、Role、User
    manager.add_command('shell',Shell(make_context=make_shell_context))
    manager.add_command('db',MigrateCommand)
    manager.run()
